package com.xiepei.day01;

import java.util.LinkedList;

/**
 * 第6课：LinkedList 基础
 * 目标：理解链表的特点，熟悉首尾操作、队列/栈用法
 *
 * 对比 ArrayList：
 * - ArrayList 擅长随机访问（get/set），插入删除慢
 * - LinkedList 擅长首尾插删，适合做队列、栈、双端队列
 */
public class Lesson06_LinkedList基础 {
    public static void main(String[] args) {
        System.out.println("=== 1. 创建 LinkedList 并添加元素 ===");
        LinkedList<String> names = new LinkedList<>();
        names.add("张三");
        names.add("李四");
        names.addLast("王五");  // 等价于 add
        names.addFirst("赵六"); // 插入到链表头部
        System.out.println("当前链表：" + names);
        System.out.println();

        System.out.println("=== 2. 访问首尾元素 ===");
        String first = names.getFirst(); // O(1)
        String last = names.getLast();
        System.out.println("头部元素：" + first);
        System.out.println("尾部元素：" + last);
        System.out.println();

        System.out.println("=== 3. 删除首尾元素 ===");
        String removedHead = names.removeFirst();
        String removedTail = names.removeLast();
        System.out.println("删除头部元素：" + removedHead);
        System.out.println("删除尾部元素：" + removedTail);
        System.out.println("删除后的链表：" + names);
        System.out.println();

        System.out.println("=== 4. 作为队列（先进先出）===");
        LinkedList<String> queue = new LinkedList<>();
        queue.offer("任务1"); // 相当于 addLast
        queue.offer("任务2");
        queue.offer("任务3");
        System.out.println("队列初始状态：" + queue);
        while (!queue.isEmpty()) {
            String task = queue.poll(); // 获取并删除头部
            System.out.println("处理：" + task + "，剩余：" + queue);
        }
        System.out.println();

        System.out.println("=== 5. 作为栈（后进先出）===");
        LinkedList<String> stack = new LinkedList<>();
        stack.push("页面A"); // 压入栈顶（链表头）
        stack.push("页面B");
        stack.push("页面C");
        System.out.println("栈初始状态：" + stack);
        while (!stack.isEmpty()) {
            String page = stack.pop(); // 取出最后进来的那个元素（LIFO）
            System.out.println("返回：" + page + "，剩余：" + stack);
        }
        System.out.println();

        System.out.println("=== 6. 性能对比提示 ===");
        System.out.println("LinkedList 适合：频繁首尾插删、实现队列/栈");
        System.out.println("ArrayList 适合：随机访问、遍历为主的需求");
    }
}


